ทดลองใช้ Scale up และ Scale down ตามเวลาที่กำหนดโดยใช้ฟังก์ชัน Auto Scaling ใน Elastic Beanstalk
ครั้งนี้ผมจะมาแนะนำ ทดลองใช้ Scale up และ Scale down ตามเวลาที่กำหนดโดยใช้ฟังก์ชัน Auto Scaling ใน Elastic Beanstalk
สิ่งที่ต้องมี
※มีการสร้าง Application, Environment ใน Elastic Beanstalk
※ถ้าเป็น Laravel แนะนำให้สร้าง Environment ตามลิงก์บทความนี้ครับ
หมายเหตุ: ถ้ามีขั้นตอนที่ซ้ำกันให้ข้ามไปได้เลยครับ
ตัวอย่างในบทความนี้ สมมติว่าผมสร้างสภาพแวดล้อมโดยใช้ชื่อดังนี้
Application:tinnakorn
Environment:tinnakorn-autoscale-schedule
การตั้งค่า Auto Scaling ขณะสร้าง Environment
ดูวิธีการตั้งค่า Auto Scaling ขณะสร้าง Environment ได้ที่ลิงก์ด้านล่างนี้ครับ
หมายเหตุ: เมื่อเริ่มต้นระบบไปแล้ว ตอนที่กลับเข้ามาตั้งค่า Capacity ใน Configuration อีกครั้ง ถ้ามีขั้นตอนที่ซ้ำกันให้ข้ามไปได้เลยครับดูตัวอย่างที่นี่เฉพาะหัวข้อนี้: การตั้งค่า Auto Scaling ขณะสร้าง Environment
การตั้งค่า Scheduled action
เมื่อเริ่มต้นระบบเสร็จแล้ว ให้ทำการเปลี่ยนแปลงการตั้งค่า Scaling cooldown ตามขั้นตอนนี้ (ต้องรอจนกว่าการเริ่มต้นระบบเสร็จสิ้นแล้วค่อยทำครับ)
เลือกConfiguration
จากเมนูด้านซ้ายในหน้า Environment ของเรา
ดูที่ด้านขวา คลิกEdit
ที่ Capacity
ดูที่หัวข้อ Auto scaling group แล้วเลื่อนลงมาด้านล่างหาScaling cooldown
และให้ตั้งค่าตามนี้:
» Scaling cooldown:60
seconds
» เลื่อนลงมาด้านล่างสุด คลิกApply
เลื่อนลงมาด้านล่างสุดที่หัวข้อ Time-based scaling
» เปลี่ยน Time zone ให้เป็นLocal
เพื่อให้แสดงเป็นเขตเวลาของประเทศไทย (+07) หลังจากเพิ่ม Schedule เสร็จแล้วนั่นเอง
» จากนั้นคลิกAdd scheduled action
การตั้งค่า Scheduled action นี้คือการตั้งค่ากำหนดการ Launch instances เพื่อสำรองการใช้งานเวลาที่จะมี User เข้ามาใช้งานเป็นจำนวนมาก เช่น ทางบริษัท CMTH มีโปรโมชันลดราคาสินค้า 60% ผ่านเว็บไซต์เป็นเวลา 1 ชั่วโมง โดยเริ่มขายสินค้าในราคาโปรโมชันตั้งแต่เวลา17:40 PM
จึงจำเป็นต้องเริ่ม Scale Out ตั้งแต่เวลา17:35 PM
เพื่อเตรียมความพร้อมให้กับเว็บไซต์ เพราะเราคาดการณ์ได้ว่าจะมีผู้เข้ามาซื้อสินค้าผ่านเว็บไซต์เป็นจำนวนมาก ทีนี้เราก็สามารถใช้วิธีนี้ในการรับมือกับสถานการณ์ที่จะเกิดขึ้นในอนาคตได้ครับ
ตัวอย่างการตั้งค่า Scheduled action นี้คือ:
» Name:EbScaleUp1035
(ชื่ออะไรก็ได้)
» Instances: Min3
, Max6
» Desired capacity:3
(โดยปกติแล้วให้ใส่ค่าเดียวกับ Min)
» Occurrence:One-time
» Start time:2022-08-04T10:35:00Z
UTC (ต้องตั้งค่าวันที่และเวลาเป็น UTC เท่านั้น ซึ่งเวลานี้จะเท่ากับ17:35
ของประเทศไทย เพราะเขตเวลาประเทศไทยคือ+07
)
» คลิกAdd
เมื่อตั้งค่าเสร็จแล้วจะแสดงรายละเอียดตามที่เราตั้งค่าไว้
ทีนี้ดูที่ Next occurrence (local time) จะเห็นว่าแสดงเป็นเวลาของประเทศไทย คือถ้าเราเลือก Time zone เป็น UTC ก็จะแสดงเป็นเวลา UTC นั่นเอง
การตั้งค่า Scheduled action นี้คือการตั้งค่ากำหนดการ Terminate instance เมื่อสถานะการใช้งานกลับมาเป็นปกติ เช่น ทางบริษัท CMTH ขายสินค้าในราคาโปรโมชันลด 60% ครบ 1 ชั่วโมงแล้ว ก็ได้ปิดการขายในราคาโปรโมชันไป แล้วหลังจากนี้ User ที่จะเข้ามาซื้อของผ่านเว็บไซต์ก็จะน้อยลง และเว็บไซต์ก็จะกลับมาเป็นปกติในเวลา18:40 PM
ทีนี้เราก็สามารถตั้งค่า Scale down เพื่อ Terminate Instance โดยอัตโนมัติด้วยการตั้งค่านี้ได้ครับ
ตัวอย่างการตั้งค่า Scheduled action นี้คือ:
» Name:EbScaleDown1140
» Instances: Min1
, Max4
» Desired capacity:1
(โดยปกติแล้วให้ใส่ค่าเดียวกับ Min)
» Occurrence:One-time
» Start time:2022-08-04T11:40:00Z
UTC (ต้องตั้งค่าวันที่และเวลาเป็น UTC เท่านั้น ซึ่งเวลานี้จะเท่ากับ18:40
ของประเทศไทย เพราะเขตเวลาประเทศไทยคือ+07
)
เมื่อเสร็จแล้วจะแสดงหน้าจอแบบนี้ จากนั้นคลิกApply
และรอระบบ Deploy การตั้งค่า Schedule สักครู่ครับ
Scheduled action (Launch instances and Terminate instance)
เมื่อระบบ Deploy การตั้งค่า Scheduled action เสร็จแล้ว และเมื่อถึงกำหนดการ Launch instances และ Terminate instance แล้ว Time-based scaling ก็จะดำเนินการตามที่เราได้ตั้งค่าไว้ครับ
※Launch instances (ข้อมูลในตัวอย่างนี้)
เมื่อถึงกำหนดการ Launch instances เช่น [10:35 UTC (หรือ 17:35 TH)] Time-based scaling ก็จะสร้าง Instance เพิ่มขึ้นมาตามที่ตั้งค่า Desired capacity: 3 ไว้ในขั้นตอนที่แล้ว
※Terminate instance (ข้อมูลในตัวอย่างนี้)
เมื่อถึงกำหนดการ Terminate instance เช่น [10:40 UTC (หรือ 17:40 TH)] Time-based scaling ก็จะ Terminate instance ตามที่ตั้งค่า Desired capacity: 1 ไว้ในขั้นตอนที่แล้ว
ขั้นตอนถัดไปคือการ ตรวจสอบผลลัพธ์การตั้งค่า Scheduled action เมื่อถึงกำหนดการที่คุณตั้งค่าไว้แล้วเริ่มทำตามขั้นตอนถัดไปได้เลยครับ
ตรวจสอบผลลัพธ์การตั้งค่า Scheduled action
เมื่อการตั้งค่า Scheduled action ได้เริ่มต้นไปแล้ว ผมก็จะตรวจสอบสถานะการ Launch instances และ Terminate instance ในขั้นตอนนี้ครับ
ตรวจสอบ Instance ที่ถูกสร้างขึ้นจากการตั้งค่า Scheduled action
หลังจาก Instance ถูกสร้างขึ้นจากการตั้งค่า Schedule แล้ว ผมจะตรวจสอบสถานะการดำเนินการต่างๆใน Events, Health และ Instance ดังนี้
※Health
เข้ามาที่ Service Elastic Beanstalk เลือกHealth
ใน Environment ของเราและดูที่ Status
จะเห็นว่า Instance ถูกสร้างเพิ่มขึ้นมา 2 Instance จนครบ 3 Instance ตามที่ตั้งค่า Desired capacity: 3 ไว้ในขั้นตอนที่แล้วครับ
※Instance
เข้ามาที่ Service EC2 เลือกInstance
และดูที่หน้า Instance
จะเห็นว่ามี Instance ถูกสร้างเพิ่มขึ้นมาตามที่แสดงใน Health เลยครับ
※Events
เข้ามาที่ Service Elastic Beanstalk เลือกEvents
ใน Environment ของเราและดูที่ Details
จะเห็นว่า Instance ถูกสร้างเพิ่มขึ้นมา 2 Instance ครับ
ตรวจสอบ Instance ที่ถูก Terminate จากการตั้งค่า Scheduled action
หลังจาก Instance ถูก Terminate จากการตั้งค่า Schedule แล้ว ผมจะตรวจสอบสถานะการดำเนินการต่างๆใน Events, Health และ Instance ดังนี้
※Health
เข้ามาที่ Service Elastic Beanstalk เลือกHealth
ดูที่ Status
ถ้า Status:Warning
แสดงข้อความ "No data received from 1 out of 3 instances." คือ Instance กำลังเริ่มทำการ Terminate ครับ
เมื่อ Terminate เสร็จแล้วจะเหลือ 1 Instance ตามที่ตั้งค่า Desired capacity: 1 ใน Scheduled action ครับ
※Instance
เข้ามาที่ Service EC2 เลือกInstance
ดูที่หน้า Instance
จะเห็นว่ามี Instance ถูก Terminate ตามที่แสดงใน Health เลยครับ
※Events
เข้ามาที่ Service Elastic Beanstalk เลือกEvents
ดูที่ Details
จะเห็นว่า Instance ถูก Removed ออกไป 2 Instance ครับ
※Scheduled action
กลับเข้ามาที่การตั้งค่า Scheduled action อีกครั้ง
จะเห็นว่าหลังจากดำเนินการ Launch instances และ Terminate instance เสร็จแล้ว กำหนดการในช่อง Next occurrence (UTC) จะหายไป
เมื่อตรวจสอบเสร็จแล้วถ้าไม่ต้องการใช้งาน ก็ให้ทำการ Removed Scheduled action ในขั้นตอนถัดไปครับ
Removed Scheduled action
เลือกกำหนดการ Launch instances และ Terminate instance ของเรา
ตัวอย่างนี้คือ✅ EbScaleUp1035 (Launch instances)
และ✅ EbScaleDown1140 (Terminate instance)
จากนั้นเลือกActions
และเลือกMark as 'removed'
เมื่อแสดงPending delete
แล้ว ให้คลิกApply
ได้เลยครับ
เพียงเท่านี้การตั้งค่า Scheduled action ก็เสร็จเรียบร้อยครับ
Recurring (Auto Scaling periodic)
เมื่อใช้ Recurring ก็จะสามารถดำเนินการในเวลาเดียวกันทุกวัน หรือ วันเดียวกันทุกสัปดาห์ได้ เนื่องจากฟังก์ชัน Auto Scaling ใน Elastic Beanstalk สามารถเปลี่ยนแปลงได้ตาม Schedule ที่ได้กำหนดไว้นั่นเอง
เช่น ช่วงกลางดึกไม่ค่อยมีผู้ใช้งานเข้ามายังเว็บไซต์ แต่ช่วงกลางวันก็จะมีผู้ใช้งานเว็บไซต์เพิ่มขึ้น (ดูแผนภาพ) จากจำนวนการเข้าถึงนี้ เราสามารถทำการกำหนด Auto Scaling ได้ตามด้านล่างนี้
0:00- 8:00 Min 2 Max 6 8:00-22:00 Min 6 Max 10 22:00-0:00 Min 2 Max 6
กรณีนี้ให้ตั้งค่าตามด้านล่างนี้
Name: EbScaleUp0800 Instances: Min 6, Max 10 Desired capacity: 6 Occurrence: Recurring Recurrence: 0 1 * * * (เพราะว่าเป็น Time zone +07 ก็จะเท่ากับเวลา 8.00 AM ทุกวัน) Start time: None (Reccuring จะเริ่มต้นตั้งแต่เวลานี้ กรณีที่ไม่ได้เลือกไว้ก็จะทำการ Recurring อยู่เสมอ) End time: None (Reccuring จะดำเนินการตั้งแต่เวลานี้ กรณีที่ไม่ได้เลือกไว้ก็จะทำการ Recurring อยู่เสมอ) Name: EbScaleDown2200 Instances: Min 2, Max 6 Desired capacity: 2 Occurrence: Recurring Recurrence: 0 15 * * * (เพราะว่าเป็น Time zone +07 ก็จะเท่ากับเวลา 22.00 PM ทุกวัน) Start time: None (Reccuring จะเริ่มต้นตั้งแต่เวลานี้ กรณีที่ไม่ได้เลือกไว้ก็จะทำการ Recurring อยู่เสมอ) End time: None (Reccuring จะดำเนินการตั้งแต่เวลานี้ กรณีที่ไม่ได้เลือกไว้ก็จะทำการ Recurring อยู่เสมอ)
หากเราสามารถคาดคะเนสถานการณ์การเข้าใช้งานของ User ทุกวันได้ เราก็จะสามารถตั้งค่ากำหนดการ Auto Scaling เป็นระยะได้ด้วยวิธีเช่นนี้
สรุป
การสาธิตนี้ผมได้เน้นไปที่การใช้ฟังก์ชัน Auto Scaling ตั้งค่า Scheduled action ใน Time-based scaling ให้เหมาะสมกับการใช้งานเว็บไซต์ของเราได้ เนื่องจากผมเห็นว่าฟังก์ชัน Auto Scaling นี้มีประโยชน์และอำนวยความสะดวกในเรื่องปรับความสมดุลการใช้งานเว็บไซต์มาก จึงนำมาเขียนลงในบทความนี้ครับ